____ _ _ _ _
| _ \ ___ | |_ (_) _ __ ___ __| | (_) __ _
| |_) | / _ \ | __| | | | '_ \ / _ \ / _| | | | / _ |
| _ < | __/ | |_ | | | |_) | | __/ | (_| | | | | (_| |
|_| \_\ \___| \__| |_| | .__/ \___| \__,_| |_| \__,_|
|_|
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Polyglottes Programm
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
Ein polyglottes Programm (polyglott = mehrsprachig) ist ein Computerprogramm, dessen Quelltext in mehr als einer Programmiersprache gültig ist; d. h., es kann vom jeweiligen Interpreter bzw. Compiler jeder der dafür vorgesehenen Sprachen fehlerfrei ausgeführt bzw. übersetzt werden. In der Regel erzeugt es bei der Ausführung in den verschiedenen Sprachen jeweils dieselbe Ausgabe. Ein solches Programm hat keinerlei Nutzen für die Allgemeinheit, seine Erstellung ist lediglich eine anspruchsvolle Übung für den Programmierer.
Contents
• Weblinks
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Funktionsweise
Während es nahezu unmöglich sein dürfte, einen natürlichsprachigen polyglotten Text zu formulieren, ist die Erstellung eines polyglotten Programms weniger schwierig, als es zunächst den Anschein hat. Bei der Entwicklung polyglotter Programme macht man sich die folgenden Tatsachen bzw. Methoden zunutze:
• Man kann durch Sprungbefehle die in der jeweiligen Sprache ungültigen Teile des Quelltextes überspringen oder die Programmausführung mit exit „rechtzeitig“ vor dem Auftauchen ungültigen Codes terminieren.
• Eine Programmzeile kann in der einen Programmiersprache ausführbaren Code, in der anderen einen Kommentar darstellen. Beispielsweise ist „# include ...“ in C eine Präprozessoranweisung, in vielen Skriptsprachen – wegen des Zeichens „#“ am Zeilenanfang – eine Kommentarzeile.
Ein einfaches Beispiel
Das folgende Beispiel ist weit weniger spektakulär als die in den Weblinks referenzierten; es wurde speziell mit dem Ziel der Verständlichkeit auch für den Laien entworfen. Es macht von den ersten drei der oben genannten Techniken Gebrauch.
Ein komplexeres Beispiel
Der folgende Quelltext ist gültig in C, PHP und Bash. Es werden alle oben beschriebenen Methoden genutzt, insbesondere ist für die Kompatibilität mit C in etlichen Fällen die Neu- oder Umdefinition von Zeichenfolgen erforderlich. Diese erfolgen in den mit „#define“ beginnenden Zeilen, die für die beiden Skriptsprachen Kommentarzeilen sind.
MS-DOS und Perl
Hello, world!
Das folgende Programm kann durch den Perl-Interpreter oder als DOS-Batchdatei ausgeführt werden. (Erläuterungen zu jeder Zeile rechts neben dem Quelltext.)
DOS-Wrapper für Perl
In ähnlicher Weise kann eine DOS-Batchdatei für den Aufruf eines Perl-Programms erstellt werden: Die DOS-Batchdatei enthält den Perl-Code und führt sich selbst (in Zeile 10) mit dem Perl-Interpreter aus. Es bedarf allerdings einigen Aufwandes, die Kommandozeilen-Argumente einzusammeln und an Perl zu übergeben:
Siehe auch
Weitere Beispiele für nutzlose, aber lehrreiche Programme:
• Hallo-Welt-Programm – die Ausgabe von „Hallo, Welt“ in den unterschiedlichsten Programmiersprachen
• Quine – Programme, die ihren eigenen Quelltext ausgeben
• Just another Perl hacker – kreative Perl-Programme, die in origineller Weise „Just another Perl hacker“ ausgeben
• Programme in Esoterischen Programmiersprachen
• Programmbeiträge für „Obfuscated Contests“ (z. B. Obfuscated Perl Contest, International Obfuscated C Code Contest)
Weblinks
(Alle hier angegebenen Quellen sind in englischer Sprache.)
• Ein 8-fach polyglottes Programm (ausführbar in Unix-Shell, C, COBOL, Fortran, Pascal, Perl, PostScript und x86-Assembler)
• Ein 7-fach polyglottes Programm (ausführbar in Bash, Befunge, C, Pascal, Perl, PostScript und TeX)
• Ein 6-fach polyglottes Programm (ausführbar in Brainfuck, Befunge, C, Perl, Unix-Shell und Whitespace)
• Eine Zusammenstellung mit 14 polyglotten Programmen